
/**
******************************************************************************
* @file    六叶树CAN二次开发demo
* @author  lys
* @version V1.1.0
* @date    2023
* @brief   用例功能:
* 以六叶树USBCAN2为例,设备通道CAN0配置为波特率为1M,CAN总线收到什么数据就回复什么数据。
* 支持:USBCAN1/USBCAN2。
* @note
*
* @endverbatim
*
******************************************************************************
* 版权:长沙六叶树教育科技有限公司
* 官网:www.liuyeshu.cn
* 更多资料教程下载见官网
******************************************************************************
修改日期    版本号   修改者   功能描述
2023.04.10 V1.1.0   LYS
----------------------------------------------------------------------------
******************************************************************************
*/
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include "ControlCAN.h"

void exit_can(int flag)
{
	//关闭设备
    LCAN_CloseDevice (4, 0);

    exit(0);
}

int main(void)
{
	UINT devType=LCAN_USBCAN2;
	UINT devIndex=0,canIndex=0;
	LCAN_INIT_CONFIG init_config;
    int ret = 0;

	//打开设备
    ret = LCAN_OpenDevice(devType, devIndex);
    if (ret == 0) {
        exit_can(1);
        return 0;
    }

	bzero(&init_config, sizeof(LCAN_INIT_CONFIG));
	
	//CAN0初始化参数
	//正常工作模式
	init_config.mode = 0;					
	//1M波特率
	init_config.timing0 = 0x00;							
	init_config.timing1 = 0x14;	
	//单过滤模式
	init_config.filter = 1;
	init_config.accCode = 0x00000000;
	init_config.accMask = 0xFFFFFFFF;

	
	//初始化CAN0通道
    ret = LCAN_InitCAN(devType, devIndex, canIndex, &init_config);					
    if (ret != LCAN_STATUS_OK) {
        exit_can(1);
        return 0;
    }

    printf("DEMO功能:CAN1波特率1M,接收到什么数据就回发什么数据。\n");

    LCAN_CAN_OBJ recv_msg[10];
    memset(recv_msg, 0, sizeof(LCAN_CAN_OBJ)*10);
	while (1) {
    int recvlen = LCAN_Receive(devType, devIndex, canIndex, recv_msg, 10, 0);
	if(0 == recvlen)
        {
            continue;
        }
        printf("---recvlen:%d\n", recvlen);
		int i,j;
		for (i=0; i<recvlen; i++) {
			printf("ID: %08x DataLen:%02x ExternFlag:%02x RemoteFlag: %02x data:", 
			recv_msg[i].id, recv_msg[i].dataLen, 
			recv_msg[i].externFlag, recv_msg[i].remoteFlag);
			for (j=0; j< recv_msg[i].dataLen; j++) {
				printf("%02x ", recv_msg[i].data[j]);
			}
			printf("\n");
		}

		if(0 < recvlen)
		{
			ret = LCAN_Transmit(devType, devIndex, canIndex, recv_msg, recvlen);
			printf ("-----send :%d\n", ret);
		}

		usleep(10000);
	}
	goto selfstop;

selfstop:
    LCAN_CloseDevice (devType, devIndex);
	return 0;
}
